import bean.Student;

/**
    final关键字代表最终、不可改变的。

    常见四种用法：
    1. 可以用来修饰一个类
        特点: 类不能有任何子类继承;(太监类例如String);
    2. 可以用来修饰一个方法
        特点: final修饰的方法无法被重写,抽象方法无法使用final修饰(和abstract互斥);
    3. 还可以用来修饰一个局部变量
        特点: final修饰局部变量为不可变的;
    4. 还可以用来修饰一个成员变量
        特点: final修饰成员变量也不可变的;
        对于final的成员变量，要么使用直接赋值，要么通过构造方法赋值。二者选其一。
 */
public class Demo01Final {
    public static void main(String[] args) {

        /*-----修饰类----------------------*/
        //查看MyClass.java类

        /*-----修饰局部变量----------------------*/
        //查看MyMethodFu.java和MyMethodZi类

        /*-----修饰局部变量----------------------*/
        // 一旦使用final用来修饰局部变量，那么这个变量就不能进行更改。
        // “一次赋值，终生不变”
        final int num2 = 200;
        System.out.println(num2); // 200
        // num2 = 250; // 错误写法！不能改变！

        /*-----修饰类引用类型对象变量----------------------*/
        // 对于基本类型来说，不可变说的是变量当中的数据不可改变
        // 对于引用类型来说，不可变说的是变量当中的地址值不可改变
        Student stu1 = new Student("赵丽颖");
        System.out.println(stu1);    //地址值
        System.out.println(stu1.getName()); // 赵丽颖

        stu1 = new Student("霍建华");
        System.out.println(stu1);  //地址值从新变化
        System.out.println(stu1.getName()); // 霍建华
        System.out.println("---------------");

        final Student stu2 = new Student("高圆圆");
        // 错误写法！final的引用类型变量，其中的地址不可改变
//        stu2 = new Student("赵又廷");
        System.out.println(stu2.getName()); // 高圆圆
        stu2.setName("高圆圆圆圆圆圆");
        System.out.println(stu2.getName()); // 高圆圆圆圆圆圆

        /*-----修饰类成员变量----------------------*/
        //查看Person.java类


    }
}
